package com.ruoyi.common.utils.excl.workbook;

import org.apache.poi.ss.usermodel.*;

/**
 * WorkbookCellUtils
 * Workbook 单元格处理类
 *
 * @author HHKJ-SERVER-ZJ
 * @since 2023/4/6 16:25
 */
public class CellUtils {

    /**
     * 设置单元格部分字体信息
     *
     * @param workbook   不同的workbook需要不同类型得字体信息
     * @param fontHeight 字体重
     * @param isBold     是否加粗
     * @param color      颜色
     * @param content    需要设置得内容
     */
    public static void updatePartContentFont(Workbook workbook, Cell cell, int fontHeight, boolean isBold, short color, String content) {
        // 创建设置字体
        Font font = FontUtils.createFont(workbook, fontHeight, isBold, color);

        // 获取title单元格富文本编辑器 设置字体
        updatePartContentFontRichStringValue(cell, content, font);
    }

    /**
     * 设置单元格部分字体信息
     *
     * @param content 需要设置得内容
     */
    public static void updatePartContentFont(Cell cell, Font font, String content) {

        // 获取title单元格富文本编辑器 设置字体
        updatePartContentFontRichStringValue(cell, content, font);
    }

    /**
     * 修改 单元格的 RichStringValue 信息
     *
     * @param cell    单元格
     * @param content 需要设置的内容字符串
     * @param font    字体信息
     */
    private static void updatePartContentFontRichStringValue(Cell cell, String content, Font font) {
        RichTextString titleRichText = cell.getRichStringCellValue();
        String titleContent = titleRichText.getString();
        int startIndex = titleContent.lastIndexOf(content);
        titleRichText.applyFont(startIndex, (startIndex + content.length()), font);
        // 设置单元格的值
        cell.setCellValue(titleRichText);
    }

    /**
     * 设置单元格部分字体信息
     *
     * @param workbook   excel workbook实体
     * @param sheetIndex excel 表格下表
     * @param rowNum     表格行数
     * @param cellNum    表格列数
     * @param fontHeight 字体重
     * @param isBold     是否加粗
     * @param color      颜色
     * @param content    需要设置得内容
     */
    public static void updatePartContentFont(Workbook workbook, int sheetIndex, int rowNum, int cellNum, int fontHeight, boolean isBold, short color, String content) {
        // 单元格
        Cell cell = getCell(workbook, sheetIndex, rowNum, cellNum);
        updatePartContentFont(workbook, cell, fontHeight, isBold, color, content);
    }

    /**
     * 设置
     *
     * @param cell 单元格信息
     */
    public static void wrapText(Workbook workbook, Cell cell) {
        // 创建单元格样式 设置折行
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setWrapText(true);
        cell.setCellStyle(cellStyle);
    }

    /**
     * 设置
     *
     * @param cell 单元格信息
     */
    public static void importWrapText(Workbook workbook, Cell cell, int fontHeight) {
        // 创建单元格样式 设置折行
        CellStyle cellStyle = workbook.createCellStyle();
        // 设置折行
        cellStyle.setWrapText(true);
        // 创建设置字体
        Font font = FontUtils.createFont(workbook, fontHeight, true, Font.COLOR_RED);
        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }

    /**
     * 设置
     *
     * @param workbook   excel workbook实体
     * @param sheetIndex 表格下标
     * @param rowNum     单元格行号
     * @param cellNum    单元格列号
     */
    public static void wrapText(Workbook workbook, int sheetIndex, int rowNum, int cellNum) {
        // 单元格
        Cell cell = getCell(workbook, sheetIndex, rowNum, cellNum);
        wrapText(workbook, cell);
    }

    /**
     * 获取单元格信息
     *
     * @param workbook   excelWorkBook实体
     * @param sheetIndex 表格下表
     * @param rowNum     单元格行号 从0开始
     * @param cellNum    单元格列号 从 0 开始
     * @return 单元格信息实体
     */
    public static Cell getCell(Workbook workbook, int sheetIndex, int rowNum, int cellNum) {
        // 单元格
        Sheet sheetAt = workbook.getSheetAt(sheetIndex);
        Row row = sheetAt.getRow(rowNum);
        return row.getCell(cellNum);
    }

    /**
     * 获取第一个单元格列
     *
     * @param row 行信息
     * @return 单元格列
     */
    public static Cell getFirstCell(Row row) {
        return row.getCell(0);
    }


    private static void setFont(Workbook workBook, Integer sheetIndex, Integer column, String format) {
        //获取 sheet
        Sheet sheetAt = workBook.getSheetAt(sheetIndex);
        //获取
        CellStyle cellStyle = workBook.createCellStyle();
        DataFormat dataFormat = workBook.createDataFormat();
        cellStyle.setDataFormat(dataFormat.getFormat(format));
        //指定表格的列样式
        sheetAt.setDefaultColumnStyle(column, cellStyle);
    }

    /**
     * **设置单元格格式为文本格式
     *
     * @param workBook
     * @param column
     * @return
     */
    public static void setTextCell(Workbook workBook, Integer column) {
        setFont(workBook, 0, column, "@");
    }

    /**
     * 设置单元格格式为格式化时间
     *
     * @param workBook 工作表
     * @param column   具体的列，下标从0开始
     */
    public static void setDataColumn(Workbook workBook, Integer column) {
        setFont(workBook, 0, column, "yyyy-MM-dd");
    }

    /**
     * 填充单元格前景色
     * <p>前景色是一般理解的填充</p>
     *
     * @param workbook   工作表
     * @param sheetIndex 表格下标（从0开始）
     * @param rowNum     单元格行号
     * @param cellNum    单元格列号
     * @param color      颜色，取 IndexedColors 枚举类
     */
    public static void setCellFillForegroundColour(Workbook workbook, int sheetIndex, int rowNum, int cellNum, short color) {
        setCellFillForegroundColour(workbook, sheetIndex, rowNum, cellNum, cellNum, color);
    }

    /**
     * 填充单元格前景色
     * <p>前景色是一般理解的填充</p>
     *
     * @param workbook     工作表
     * @param sheetIndex   表格下标（从0开始）
     * @param rowNum       单元格行号
     * @param cellStartNum 单元格开始列号
     * @param cellEndNum   单元格结束列号
     * @param color        颜色，取 IndexedColors 枚举类
     */
    public static void setCellFillForegroundColour(Workbook workbook, int sheetIndex, int rowNum, int cellStartNum, int cellEndNum, short color) {
        // 前景是填充前景而不是字体颜色。
        CellStyle style = workbook.createCellStyle();
        style.setFillForegroundColor(color);
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //填充颜色会导致文字不居中，需要再次设置
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        // 添加单元格线条
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        //获取需要设置的单元格
        Cell cell;
        for (int cellIndex = cellStartNum; cellIndex <= cellEndNum; cellIndex++) {
            cell = getCell(workbook, sheetIndex, rowNum, cellIndex);
            cell.setCellStyle(style);
        }
    }
}
